package Homework;

import java.util.Scanner;

/**
 * @program: Java_Study
 * @author: Xiaofan
 * @createTime: 2021-07-06 20:15
 * @description: Functions of this class is 螺旋矩阵(蛇形矩阵)
 **/
public class A2 {
    public static class Snack{
        int squre[][] = new int[21][21];//用于存贪吃蛇走的路
        boolean vis[][] = new boolean[21][21];//用于存当前这个位置是否有好吃的
        int i;//用于表示当前贪吃蛇的行坐标
        int j;//用于表示当前贪吃蛇的列坐标
    }
    public static void main(String arg[]) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        while (n<1||n>20){
            n=scanner.nextInt();
        }
        matrix(n);
        Snack s=matrix(n);
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                System.out.print(s.squre[i][j]+" ");
            }
            System.out.println();
        }
    }

    /**
     *
     * @param n 贪吃蛇走过路径的行数
     * @return 返回贪吃蛇走的路径
     */
    private static Snack matrix(int n) {
        int tot = n * n;
        int num = 1;
        Snack snack =new Snack();
        snack.i =snack.j = 0;
        snack.vis[0][0] = true;
        snack.squre[0][0] = num;
        while (num < tot) {
            //从左往右走行 如果下一个位置没有越界同时没有被走过的话
            while (snack.j + 1 < n && !snack.vis[snack.i][snack.j + 1] && num <= tot) {
                snack.vis[snack.i][snack.j + 1] = true;
                snack.squre[snack.i][++snack.j] = ++num;
            }
            //从上往下走列 如果下一个位置没有越界同时没有被走过的话
            while (snack.i + 1 < n && !snack.vis[snack.i + 1][snack.j] && num <= tot) {
                snack.vis[snack.i + 1][snack.j] = true;
                snack.squre[++snack.i][snack.j] = ++num;
            }
            //从右往左走行 如果下一个位置没有越界同时没有被走过的话
            while (snack.j - 1 >= 0 && !snack.vis[snack.i][snack.j - 1] && num <= tot) {
                snack.vis[snack.i][snack.j - 1] = true;
                snack.squre[snack.i][--snack.j] = ++num;
            }
            //从下往上走列 如果下一个位置没有越界同时没有被走过的话
            while (snack.i - 1 >= 0 && !snack.vis[snack.i - 1][snack.j] && num <= tot) {
                snack.vis[snack.i - 1][snack.j] = true;
                snack.squre[--snack.i][snack.j] = ++num;
            }
        }
        return snack;
    }
}